#include <stdio.h>

#ifdef __GNUC__
static inline void cpuid(int code, int *a, int *b, int *c, int *d)
{
	__asm volatile("cpuid":"=a"(*a), "=b"(*b), "=c"(*c), "=d"(*d):"a"(code));
}
#endif

#ifdef _MSC_VER
#include <intrin.h>
#endif

struct cpuid_1_eax
{
	unsigned int stepping:4;
	unsigned int model:4;
	unsigned int family_id:4;
	unsigned int processor_type:2;
	unsigned int reserved1:2;
	unsigned int extended_model_id:4;
	unsigned int extended_family_id:8;
	unsigned int reserved2:4;
};

int main()
{
	struct cpuid_1_eax * tmp;
	int b[4];

#ifdef _MSC_VER
	__cpuid(b, 1);
#endif

#ifdef __GNUC__
	cpuid(1, &b[0], &b[1], &b[2], &b[3]);
#endif

	tmp = (struct cpuid_1_eax *) &b[0];

	printf("stepping=%d\n", tmp->stepping);
	printf("model=%d\n", tmp->model);
	printf("family_id=%d\n", tmp->family_id);
	printf("processor_type=%d\n", tmp->processor_type);
	printf("extended_model_id=%d\n", tmp->extended_model_id);
	printf("extended_family_id=%d\n", tmp->extended_family_id);

	return 0;
}

#if 0
/*
 * intel
 */
0000000000001169 <cpuid>:
    1169:	55                   	push   %rbp				// rsp=0x7fffffffe180	rbp=0x7fffffffe1c0
    116a:	48 89 e5             	mov    %rsp,%rbp		// rsp=0x7fffffffe180	rbp=0x7fffffffe180
    116d:	53                   	push   %rbx				// rsp=0x7fffffffe178	rbp=0x7fffffffe180
    116e:	89 7d f4             	mov    %edi,-0xc(%rbp)	// edi=1				(rbp-0xc)=0x7fffffffe174:0x555552e000000001
    1171:	48 89 75 e8          	mov    %rsi,-0x18(%rbp)	// rsi=0x7fffffffe1a0	(rbp-0x18)=0x7fffffffe168:0x00007fffffffe1a0
    1175:	48 89 55 e0          	mov    %rdx,-0x20(%rbp)	// rdx=0x7fffffffe1a4	(rbp-0x20)=0x7fffffffe160:0x00007fffffffe1a4
    1179:	48 89 4d d8          	mov    %rcx,-0x28(%rbp)	// rcx=0x7fffffffe1a8	(rbp-0x28)=0x7fffffffe158:0x00007fffffffe1a8
    117d:	4c 89 45 d0          	mov    %r8,-0x30(%rbp)	// r8=0x7fffffffe1ac	(rbp-0x30)=0x7fffffffe150:0x00007fffffffe1ac
    1181:	8b 45 f4             	mov    -0xc(%rbp),%eax	// eax=1
    1184:	0f a2                	cpuid  
    1186:	89 de                	mov    %ebx,%esi		// esi=0x18400800
    1188:	89 c7                	mov    %eax,%edi		// edi=0x50657
    118a:	48 8b 45 e8          	mov    -0x18(%rbp),%rax	// rax=0x7fffffffe1a0
    118e:	89 38                	mov    %edi,(%rax)		// (rax)=0x7fffffffe1a0:0x0000000000050657
    1190:	48 8b 45 e0          	mov    -0x20(%rbp),%rax	// rax=0x7fffffffe1a4
    1194:	89 30                	mov    %esi,(%rax)		// (rax)=0x7fffffffe1a4:0x5555508018400800
    1196:	48 8b 45 d8          	mov    -0x28(%rbp),%rax	// rax=0x7fffffffe1a8
    119a:	89 08                	mov    %ecx,(%rax)		// (rax)=0x7fffffffe1a8:0x000055557ffefbff	ecx=0x7ffefbff
    119c:	48 8b 45 d0          	mov    -0x30(%rbp),%rax	// rax=0x7fffffffe1ac
    11a0:	89 10                	mov    %edx,(%rax)		// (rax)=0x7fffffffe1ac:0xffffe2b0bfebfbff	edx=0xbfebfbff
    11a2:	90                   	nop						// rsp=0x7fffffffe178	rbp=0x7fffffffe180
    11a3:	5b                   	pop    %rbx				// rsp=0x7fffffffe180	rbp=0x7fffffffe180
    11a4:	5d                   	pop    %rbp				// rsp=0x7fffffffe188	rbp=0x7fffffffe1c0
    11a5:	c3                   	retq					// rsp=0x7fffffffe190	rbp=0x7fffffffe1c0	retq 相当于 : pop %rip

00000000000011a6 <main>:
    11a6:	f3 0f 1e fa          	endbr64				// rsp=0x7fffffffe1c8	rbp=0x0
    11aa:	55                   	push   %rbp			// rsp=0x7fffffffe1c0	
    11ab:	48 89 e5             	mov    %rsp,%rbp	// rsp=0x7fffffffe1c0	rbp=0x7fffffffe1c0
    11ae:	48 83 ec 30          	sub    $0x30,%rsp	// rsp=0x7fffffffe190	rbp=0x7fffffffe1c0
    11b2:	64 48 8b 04 25 28 00 	mov    %fs:0x28,%rax	// rax=0xc6a79e60e6de8500
    11b9:	00 00 
    11bb:	48 89 45 f8          	mov    %rax,-0x8(%rbp)	// (rbp-0x8)=0x7fffffffe1b8: 0xc6a79e60e6de8500
    11bf:	31 c0                	xor    %eax,%eax		// eax=0
    11c1:	48 8d 45 e0          	lea    -0x20(%rbp),%rax		// rax=rbp-0x20=0x7fffffffe1a0
    11c5:	48 8d 70 0c          	lea    0xc(%rax),%rsi		// rsi=rbp-0x20+0xc=0x7fffffffe1a0+0xc=0x7fffffffe1ac
    11c9:	48 8d 45 e0          	lea    -0x20(%rbp),%rax		// rax=rbp-0x20=0x7fffffffe1a0
    11cd:	48 8d 48 08          	lea    0x8(%rax),%rcx		// rcx=rbp-0x20+0x8=0x7fffffffe1a8
    11d1:	48 8d 45 e0          	lea    -0x20(%rbp),%rax		// rax=rbp-0x20=0x7fffffffe1a0
    11d5:	48 8d 50 04          	lea    0x4(%rax),%rdx		// rdx=rbp-0x20+0x4=0x7fffffffe1a4
    11d9:	48 8d 45 e0          	lea    -0x20(%rbp),%rax		// rax=rbp-0x20=0x7fffffffe1a0
    11dd:	49 89 f0             	mov    %rsi,%r8			// r8=rbp-0x20+0xc=0x7fffffffe1ac
    11e0:	48 89 c6             	mov    %rax,%rsi		// rsi=rbp-0x20=0x7fffffffe1a0
    11e3:	bf 01 00 00 00       	mov    $0x1,%edi		// edi=1
    11e8:	e8 7c ff ff ff       	callq  1169 <cpuid>		// cpuid(edi, rsi, rdx, rcx, r8) (1, 0x7fffffffe1a0, 0x7fffffffe1a4, 0x7fffffffe1a8, 0x7fffffffe1ac)
															// rsp=0x7fffffffe188	rbp=0x7fffffffe1c0
    11ed:	48 8d 45 e0          	lea    -0x20(%rbp),%rax		// rsp=0x7fffffffe190	rbp=0x7fffffffe1c0	rax=0x7fffffffe1a0	rbp-0x20=0x7fffffffe1a0:0x1840080000050657
    11f1:	48 89 45 d8          	mov    %rax,-0x28(%rbp)		// (rbp-0x28)=0x7fffffffe1a0	rax=0x7fffffffe1a0	rbp-0x28=0x7fffffffe198:0x00007fffffffe1a0
    11f5:	48 8b 45 d8          	mov    -0x28(%rbp),%rax		// rax=(rbp-0x28)=0x7fffffffe1a0	rbp-0x28=0x7fffffffe198:0x00007fffffffe1a0
    11f9:	0f b6 00             	movzbl (%rax),%eax		// eax=0x57		(rax)=(rbp-0x28)=(0x7fffffffe1a0)=0x7fffffffe1a0:0x1840080000050657
    11fc:	83 e0 0f             	and    $0xf,%eax		// eax=eax&0xf=0x7		/* 取字节低四位 */
    11ff:	0f b6 c0             	movzbl %al,%eax			// eax=al=0x7
    1202:	89 c6                	mov    %eax,%esi		// esi=eax=0x7
    1204:	48 8d 3d f9 0d 00 00 	lea    0xdf9(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>
    120b:	b8 00 00 00 00       	mov    $0x0,%eax
    1210:	e8 5b fe ff ff       	callq  1070 <printf@plt>	// rsp=0x7fffffffe190	rbp=0x7fffffffe1c0
    1215:	48 8b 45 d8          	mov    -0x28(%rbp),%rax		// rax=(rbp-0x28)=rbp-0x20=0x7fffffffe1a0
    1219:	0f b6 00             	movzbl (%rax),%eax		// eax=(rax)=(rbp-0x20)=0x57
    121c:	c0 e8 04             	shr    $0x4,%al			// al=al>>4=0x5		/* 取字节高四位 */
    121f:	0f b6 c0             	movzbl %al,%eax			// eax=al=0x5
    1222:	89 c6                	mov    %eax,%esi		// esi=eax=0x5
    1224:	48 8d 3d e6 0d 00 00 	lea    0xde6(%rip),%rdi        # 2011 <_IO_stdin_used+0x11>
    122b:	b8 00 00 00 00       	mov    $0x0,%eax
    1230:	e8 3b fe ff ff       	callq  1070 <printf@plt>
    1235:	48 8b 45 d8          	mov    -0x28(%rbp),%rax		// rax=0x7fffffffe1a0	x/xg 0x7fffffffe1a0:0x1840080000050657	x/8xb 0x7fffffffe1a0:0x57    0x06    0x05    0x00    0x00    0x08    0x40    0x18
    1239:	0f b6 40 01          	movzbl 0x1(%rax),%eax		// eax=0x6	(rax+0x1)=0x7fffffffe1a0+1=0x7fffffffe1a1=0x6
    123d:	83 e0 0f             	and    $0xf,%eax		// eax=eax&0xf=0x6	
    1240:	0f b6 c0             	movzbl %al,%eax			// eax=al=0x6
    1243:	89 c6                	mov    %eax,%esi		// esi=0x6
    1245:	48 8d 3d cf 0d 00 00 	lea    0xdcf(%rip),%rdi        # 201b <_IO_stdin_used+0x1b>
    124c:	b8 00 00 00 00       	mov    $0x0,%eax
    1251:	e8 1a fe ff ff       	callq  1070 <printf@plt>
    1256:	48 8b 45 d8          	mov    -0x28(%rbp),%rax		// rax=0x7fffffffe1a0
    125a:	0f b6 40 01          	movzbl 0x1(%rax),%eax		// eax=(rax+0x1)=0x6
    125e:	c0 e8 04             	shr    $0x4,%al			// al=al>>4=0x0
    1261:	83 e0 03             	and    $0x3,%eax		// eax&=3=0x0
    1264:	0f b6 c0             	movzbl %al,%eax			// eax=0x0
    1267:	89 c6                	mov    %eax,%esi
    1269:	48 8d 3d b9 0d 00 00 	lea    0xdb9(%rip),%rdi        # 2029 <_IO_stdin_used+0x29>
    1270:	b8 00 00 00 00       	mov    $0x0,%eax
    1275:	e8 f6 fd ff ff       	callq  1070 <printf@plt>
    127a:	48 8b 45 d8          	mov    -0x28(%rbp),%rax		// rax=0x7fffffffe1a0
    127e:	0f b6 40 02          	movzbl 0x2(%rax),%eax		// eax=(rax+0x2)=0x5
    1282:	83 e0 0f             	and    $0xf,%eax			// eax=0x5
    1285:	0f b6 c0             	movzbl %al,%eax				// eax=0x5
    1288:	89 c6                	mov    %eax,%esi
    128a:	48 8d 3d ab 0d 00 00 	lea    0xdab(%rip),%rdi        # 203c <_IO_stdin_used+0x3c>
    1291:	b8 00 00 00 00       	mov    $0x0,%eax	
    1296:	e8 d5 fd ff ff       	callq  1070 <printf@plt>
    129b:	48 8b 45 d8          	mov    -0x28(%rbp),%rax		// rax=0x7fffffffe1a0
    129f:	0f b7 40 02          	movzwl 0x2(%rax),%eax		// eax=0x5
    12a3:	66 c1 e8 04          	shr    $0x4,%ax				// ax=0x0
    12a7:	80 e4 ff             	and    $0xff,%ah			// ah=0x0
    12aa:	0f b6 c0             	movzbl %al,%eax				// eax=0x0
    12ad:	89 c6                	mov    %eax,%esi
    12af:	48 8d 3d 9c 0d 00 00 	lea    0xd9c(%rip),%rdi        # 2052 <_IO_stdin_used+0x52>
    12b6:	b8 00 00 00 00       	mov    $0x0,%eax
    12bb:	e8 b0 fd ff ff       	callq  1070 <printf@plt>
    12c0:	b8 00 00 00 00       	mov    $0x0,%eax
    12c5:	48 8b 55 f8          	mov    -0x8(%rbp),%rdx
    12c9:	64 48 33 14 25 28 00 	xor    %fs:0x28,%rdx
    12d0:	00 00 
    12d2:	74 05                	je     12d9 <main+0x133>
    12d4:	e8 87 fd ff ff       	callq  1060 <__stack_chk_fail@plt>
    12d9:	c9                   	leaveq 
    12da:	c3                   	retq   
    12db:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)

/*
 * arm
 */



#endif

